package main

import "fmt"

func calc(index string, a, b int) int {
	ret := a + b
	fmt.Println(index, a, b, ret)
	return ret
}

func main() {
	x := 1
	y := 2
	defer calc("AA", x, calc("A", x, y))
	x = 10
	defer calc("BB", x, calc("B", x, y))
	y = 20
}

// 问，上面代码的输出结果是？（提示：defer注册要延迟执行的函数时该函数所有的参数都需要确定其值）
/*
输出结果：
A 1 2 3
B 10 2 12
BB 10 12 22
AA 1 3 4
*/

/*
执行流程解析：
1. 在进入 main 函数时，首先声明了变量 x 和 y，并分别赋值为 1 和 2。

2. 在第一个 defer 语句中，calc("A", x, y) 被先调用，输出 "A", 1, 2, 3，然后将结果3 压入延迟调用的栈中。
这是因为 defer 语句中的函数会在 defer 语句所在函数执行结束之前被调用。

3. 接着，calc("AA", x, 3) 被调用，输出 "AA", 1, 3, 4，然后将结果 4 返回，并继续执行 defer 语句。
由于 defer 的执行是后进先出（LIFO）的，所以 calc("AA", x, 3) 的结果会在 calc("BB", x, 20) 的结果之前被执行。

4. 在第二个 defer 语句中，calc("B", x, y) 被先调用，输出 "B", 10, 2, 12，然后将结果 12 压入延迟调用的栈中。
   继续执行 calc("BB", 10, 12)，输出 "BB", 10, 12, 22，然后将结果 22 返回。
*/
